home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Software Vault: The Gold Collection
/
Software Vault - The Gold Collection (American Databankers) (1993).ISO
/
cdr05
/
shwdib.zip
/
DRAWDIB.C
< prev
next >
Wrap
C/C++ Source or Header
|
1993-07-26
|
36KB
|
979 lines
/*******************************************************************************
* *
* MODULE : DrawDIB.c *
* *
* PURPOSE : Handles most of the SHOWDIB's DIB drawing and clipboard *
* operations. *
* *
* FUNCTIONS : *
* PrintDIB() - Sets the current DIB bits to the *
* printer DC. *
* *
* AppPaint() - Sets the DIB/bitmap bits on the *
* screen or the given device. *
* *
* DrawSelect() - Draws selected clip rectangle on *
* the DC/screen. *
* *
* NormalizeRect() - Swaps reversed rectangle coords. *
* *
* TrackMouse() - Draws rubberbanding rectangle and *
* displays it's dimensions. *
* *
* BandDIB() - Outputs DIB in bands to device. *
* *
* SizeWindow() - Sizes app. window based on client *
* dimensions and style. *
* *
* GetRealClientRect() - Calculates client rectangle dimen- *
* sions if scrollbars are present. *
* *
* SetScrollRanges() - Sets global scroll ranges. *
* *
* CopyHandle() - Makes a copy of memory block. *
* *
* CopyPalette() - Makes a copy of the GDI logical *
* palette. *
* *
* CopyBitmap() - Copies given bitmap to another. *
* *
* CropBitmap() - Crops a bitmap to the given size. *
* *
* RenderFormat() - renders currently displayed DIB *
* in CF_BITMAP or CF_DIB format. *
* *
* RealizeDibFormat() - Realizes the DIB in given format. *
* *
* ErrMsg() - Pops an error message to user. *
* *
* fDialog() - Displays a dialog box. *
* *
* AppAbout() - Shows the About.. dialog box. *
* *
*******************************************************************************/
// COPYRIGHT:
//
// (C) Copyright Microsoft Corp. 1992. All rights reserved.
//
// You have a royalty-free right to use, modify, reproduce and
// distribute the Sample Files (and/or any modified version) in
// any way you find useful, provided that you agree that
// Microsoft has no warranty obligations or liability for any
// Sample Application Files which are modified.
#include <windows.h>
#include <io.h>
#include <stdio.h>
#include "showdib.h"
POINT ptSize; /* Stores DIB dimensions */
/****************************************************************************
* *
* FUNCTION : PrintDIB(HWND hWnd, HDC hDC, int x, int y, int dx, int dy)*
* *
* PURPOSE : Set the DIB bits to the printer DC. *
* *
****************************************************************************/
void PrintDIB (hWnd, hDC, x, y, dx, dy)
HWND hWnd;
HDC hDC;
int x, y;
int dx, dy;
{
BITMAPINFOHEADER bi;
int dibX, dibY;
int dibDX, dibDY;
if (!bLegitDraw)
return;
DibInfo(hbiCurrent, &bi);
if (IsRectEmpty(&rcClip))
{
dibX = 0;
dibY = 0;
dibDX = (int)bi.biWidth;
dibDY = (int)bi.biHeight;
}
else
{
dibX = rcClip.left;
dibY = (int)bi.biHeight - 1 - rcClip.bottom;
dibDX = rcClip.right - rcClip.left;
dibDY = rcClip.bottom - rcClip.top;
}
if (hdibCurrent)
{
/* Stretch the DIB to printer DC */
StretchDibBlt(hDC, x, y, dx, dy, hdibCurrent, dibX, dibY, dibDX, dibDY,
SRCCOPY);
}
else if (achFileName[0])
{
SetMapMode(hDC, MM_ANISOTROPIC);
SetViewportOrg(hDC, x, y);
SetViewportExt(hDC, dx, dy);
BandDIB(hWnd, hDC, 0, 0);
}
}
/****************************************************************************
* *
* FUNCTION : AppPaint(HWND hWnd, HDC hDC, int x, int y) *
* *
* PURPOSE : Sets the DIB/bitmap bits on the screen or the given device*
* *
****************************************************************************/
void AppPaint (hWnd, hDC, x, y)
HWND hWnd;
HDC hDC;
int x, y;
{
HPALETTE hpalT;
BITMAPINFOHEADER bi;
SetWindowOrg(hDC, x, y);
SetBkMode(hDC, wTransparent);
if (bLegitDraw)
{
hpalT = SelectPalette(hDC, hpalCurrent, FALSE);
RealizePalette(hDC);
if (hbmCurrent && !bDIBToDevice)
{
DrawBitmap(hDC, 0, 0, hbmCurrent, SRCCOPY);
}
else if (hdibCurrent)
{
DibInfo(hdibCurrent, &bi);
DibBlt(hDC, 0, 0, (int)bi.biWidth, (int)bi.biHeight, hdibCurrent, 0, 0
, SRCCOPY);
}
else if (achFileName[0])
{
BandDIB(hWnd, hDC, 0, 0);
}
SelectPalette(hDC, hpalT, FALSE);
}
DrawSelect(hDC, TRUE);
}
/****************************************************************************
* *
* FUNCTION : DrawSelect(HDC hdc, BOOL fDraw) *
* *
* PURPOSE : Draws the selected clip rectangle with its dimensions on *
* the DC/screen *
* *
****************************************************************************/
void DrawSelect (hdc, fDraw)
HDC hdc;
BOOL fDraw;
{
char sz[80];
DWORD dw;
int x, y, len, dx, dy;
HDC hdcBits;
HBITMAP hbm;
if (!IsRectEmpty(&rcClip))
{
/* If a rectangular clip region has been selected, draw it */
PatBlt(hdc, rcClip.left, rcClip.top, rcClip.right - rcClip.left, 1,
DSTINVERT);
PatBlt(hdc, rcClip.left, rcClip.bottom, 1, -(rcClip.bottom - rcClip.top),
DSTINVERT);
PatBlt(hdc, rcClip.right - 1, rcClip.top, 1, rcClip.bottom - rcClip.top,
DSTINVERT);
PatBlt(hdc, rcClip.right, rcClip.bottom - 1, -(rcClip.right - rcClip.left
), 1, DSTINVERT);
/* Format the dimensions string ...*/
wsprintf(sz, "%dx%d", rcClip.right - rcClip.left, rcClip.bottom - rcClip.
top);
len = lstrlen(sz);
/* ... and center it in the rectangle */
dw = GetTextExtent(hdc, sz, len);
dx = LOWORD (dw);
dy = HIWORD (dw);
x = (rcClip.right + rcClip.left - dx) / 2;
y = (rcClip.bottom + rcClip.top - dy) / 2;
hdcBits = CreateCompatibleDC(hdc);
SetTextColor(hdcBits, 0xFFFFFFL);
SetBkColor(hdcBits, 0x000000L);
/* Output the text to the DC */
if (hbm = CreateBitmap(dx, dy, 1, 1, NULL))
{
hbm = SelectObject(hdcBits, hbm);
ExtTextOut(hdcBits, 0, 0, 0, NULL, sz, len, NULL);
BitBlt(hdc, x, y, dx, dy, hdcBits, 0, 0, SRCINVERT);
hbm = SelectObject(hdcBits, hbm);
DeleteObject(hbm);
}
DeleteDC(hdcBits);
}
}
/****************************************************************************
* *
* FUNCTION : NormalizeRect(RECT *prc) *
* *
* PURPOSE : If the rectangle coordinates are reversed, swaps them *
* *
****************************************************************************/
void PASCAL NormalizeRect (prc)
RECT *prc;
{
if (prc->right < prc->left)
SWAP(prc->right,prc->left);
if (prc->bottom < prc->top)
SWAP(prc->bottom,prc->top);
}
/****************************************************************************
* *
* FUNCTION : TrackMouse(HWND hwnd, POINT pt) *
* *
* PURPOSE : Draws a rubberbanding rectangle and displays it's *
* dimensions till the mouse button is released *
* *
****************************************************************************/
void TrackMouse (hwnd, pt)
HWND hwnd;
POINT pt;
{
HDC hdc;
MSG msg;
POINT ptOrigin;
RECT rcClient;
hdc = GetDC(hwnd);
SetCapture(hwnd);
GetClientRect(hwnd, &rcClient);
/* Get mouse coordinates relative to origin of DIB */
ptOrigin.x = GetScrollPos(hwnd, SB_HORZ);
ptOrigin.y = GetScrollPos(hwnd, SB_VERT);
pt.x += ptOrigin.x;
pt.y += ptOrigin.y;
/* Display the coordinates */
SetWindowOrg(hdc, ptOrigin.x, ptOrigin.y);
DrawSelect(hdc, FALSE);
/* Initialize clip rectangle to the point */
rcClip.left = pt.x;
rcClip.top = pt.y;
rcClip.right = pt.x;
rcClip.bottom = pt.y;
/* Eat mouse messages until a WM_LBUTTONUP is encountered. Meanwhile
* continue to draw a rubberbanding rectangle and display it's dimensions
*/
for (;;)
{
if (GetMessage(&msg, NULL, WM_MOUSEFIRST, WM_MOUSELAST))
{
DrawSelect(hdc, FALSE);
rcClip.left = pt.x;
rcClip.top = pt.y;
rcClip.right = LOWORD(msg.lParam) + ptOrigin.x;
rcClip.bottom = HIWORD(msg.lParam) + ptOrigin.y;
NormalizeRect(&rcClip);
DrawSelect(hdc, TRUE);
if (msg.message == WM_LBUTTONUP)
break;
}
else
continue;
}
ReleaseCapture();
ReleaseDC(hwnd, hdc);
}
/****************************************************************************
* *
* FUNCTION : BandDIB(HWND hWnd, HDC hDC, int x, int y) *
* *
* PURPOSE : Outputs the DIB in bands to a device or the screen, using *
* the maximum possible band size. *
* *
****************************************************************************/
void BandDIB (hWnd, hDC, x, y)
HWND hWnd;
HDC hDC;
int x, y;
{
HBITMAP hBitmap, hOld;
HDC hMemDC;
LPSTR pBuf;
LPBITMAPINFOHEADER lpbi;
WORD wRead, wActualPosition, wScansLeft;
DWORD dwMapSize;
DWORD dwScans;
WORD wBitmapHeight;
RECT Rect;
HANDLE hBuf;
BOOL bSuccess = FALSE;
WORD nBandSize;
HPALETTE hOldMemPal;
HPALETTE hOldPal;
int fh;
OFSTRUCT of;
/* Open the map file and get the information out */
fh = OpenFile(achFileName, (LPOFSTRUCT)&of, OF_READ);
if (fh == -1)
return;
lpbi = (VOID FAR *)GlobalLock(hbiCurrent);
if (!lpbi)
{
_lclose(fh);
return;
}
/* Compute scan size in bytes */
dwScans = WIDTHBYTES((DWORD)lpbi->biWidth * lpbi->biBitCount);
wBitmapHeight = (WORD)lpbi->biHeight;
wScansLeft = (WORD)lpbi->biHeight;
hMemDC = NULL;
for (nBandSize = wScansLeft; nBandSize >= MINBAND || nBandSize == wScansLeft
; nBandSize -= BANDINCREMENT)
{
/* Attempt to maximize band size by trying to allocate a buffer
* for the given band size. If allocation fails, try again with the
* smaller band size.
*/
hBuf = GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, dwScans * nBandSize);
if (!hBuf)
continue;
/* Show success and exit loop if we're going to set bits to device. */
if (bDIBToDevice)
{
hMemDC = 1;
break;
}
else
{
/* Create a device-dependent bitmap to hold the bits */
hBitmap = CreateCompatibleBitmap(hDC, (WORD)lpbi->biWidth, nBandSize);
if (!hBitmap)
{
/* Try again for the next smaller band size */
GlobalFree(hBuf);
continue;
}
/* Create a memory context for the bitmap */
if (!(hMemDC = CreateCompatibleDC(hDC)))
{
GlobalFree(hBuf);
DeleteObject(hBitmap);
continue;
}
else
/* Success in creating a DC */
break;
}
}
if (!hMemDC)
{
/* We failed allocation , so give error message and quit */
if (GetFocus() == hWnd)
{
ErrMsg("No memory available!");
ValidateRect(hWnd, (LPRECT)(NULL));
}
else
MessageBeep(0);
GlobalUnlock(hbiCurrent);
_lclose(fh);
return;
}
pBuf = GlobalLock(hBuf);
/* Calculate number of bytes to be transferred */
dwMapSize = dwScans * nBandSize;
/* Manipulate palette appropriately */
if (!bDIBToDevice)
hOldMemPal = SelectPalette(hMemDC, hpalCurrent, 0);
/* Now get to the start of the map in the file */
_llseek(fh, dwOffset, SEEK_SET);
/* we are now all set to start off */
wActualPosition = wScansLeft;
Rect.left = 0;
Rect.right = (WORD)lpbi->biWidth;
hOldPal = SelectPalette(hDC, hpalCurrent, 0);
RealizePalette(hDC);
do
{
/* Read in nBandSize scans or whatever is left */
if (wScansLeft > nBandSize)
wRead = nBandSize;
else
wRead = wScansLeft;
Rect.bottom = wActualPosition;
wActualPosition -= wRead;
Rect.top = wActualPosition;
dwMapSize = ((DWORD)wRead) * dwScans;
/* Now read in the map to the global buffer */
if (RectVisible(hDC, &Rect))
{
lread(fh, (LPSTR)pBuf, dwMapSize);
if (bDIBToDevice)
{
if (wRead != (WORD)SetDIBitsToDevice(hDC, x, y, (WORD)lpbi->biWidth
, wBitmapHeight, 0, 0,
wBitmapHeight - wScansLeft,
wRead, pBuf, (LPBITMAPINFO)
lpbi, fPalColors ?
DIB_PAL_COLORS :
DIB_RGB_COLORS))
{
ErrMsg("Could not draw DIB scans to device!");
GlobalUnlock(hBuf);
GlobalFree(hBuf);
GlobalUnlock(hbiCurrent);
_lclose(fh);
return;
}
}
else
{
lpbi->biHeight = wRead;
/* Set the DIB bits to a device-dependent format */
if ((WORD)lpbi->biHeight != (WORD)SetDIBits(hMemDC, hBitmap, 0, (
WORD)lpbi->biHeight,
pBuf, (LPBITMAPINFO)
lpbi, fPalColors ?
DIB_PAL_COLORS :
DIB_RGB_COLORS))
{
ErrMsg("Could not draw DIB scans!");
GlobalUnlock(hBuf);
GlobalFree(hBuf);
GlobalUnlock(hbiCurrent);
_lclose(fh);
return;
}
/* Blt own map onto the screen, remembering the point to start */
hOld = SelectObject(hMemDC, hBitmap);
if (!BitBlt(hDC, 0, wActualPosition, (WORD)lpbi->biWidth, (WORD)
lpbi->biHeight, hMemDC, 0, 0, SRCCOPY))
{
ErrMsg("Could not draw map to screen!");
GlobalUnlock(hBuf);
GlobalFree(hBuf);
GlobalUnlock(hbiCurrent);
_lclose(fh);
return;
}
SelectObject(hMemDC, hOld);
/* Restore the value of bitmap height */
lpbi->biHeight = wBitmapHeight;
}
}
else
{
/* This chunk is not visible, seek over the data in the file */
_llseek(fh, dwMapSize, SEEK_CUR);
}
wScansLeft -= wRead;
} while (wScansLeft > 0);
/* Delete the objects just created above */
GlobalUnlock(hBuf);
GlobalFree(hBuf);
SelectPalette(hDC, hOldPal, 0);
/* Set success flag */
bSuccess = TRUE;
if (!bDIBToDevice)
{
SelectPalette(hMemDC, hOldMemPal, 0);
DeleteDC(hMemDC);
DeleteObject(hBitmap);
}
GlobalUnlock(hbiCurrent);
/* Close the file */
_lclose(fh);
}
/****************************************************************************
* *
* FUNCTION : SizeWindow(HWND hWnd) *
* *
* PURPOSE : Sizes the app. window based on client dimensions (DIB *
* dimensions) and style. Sets the caption text. *
* *
****************************************************************************/
void SizeWindow (hWnd)
HWND hWnd;
{
char *pstr;
char Name[60];
RECT Rectangle;
BITMAPINFOHEADER bi;
/* Get information about current DIB */
DibInfo(hbiCurrent, &bi);
/* Extract the filename from the full pathname */
pstr = achFileName + lstrlen(achFileName) - 1;
while ((*pstr != '\\') && (*pstr != ':') && (pstr >= achFileName))
pstr--;
pstr++;
/* Format filename along with the DIB attributes */
wsprintf(Name, "%ls (%ls %dx%dx%d%ls)", (LPSTR)szAppName, (LPSTR)pstr, (WORD
)bi.biWidth, (WORD)bi.biHeight, (WORD)bi.biBitCount, bi.
biCompression == BI_RGB ? (LPSTR)" RGB" : bi.biCompression ==
BI_RLE8 ? (LPSTR)" RLE8" : (LPSTR)" RLE4");
/* Show formatted text in the caption bar */
SetWindowText(hWnd, Name);
/* Store the size in ptSize, so the scroll bars will work. */
ptSize.x = (WORD)bi.biWidth;
ptSize.y = (WORD)bi.biHeight;
if (IsZoomed(hWnd))
SetScrollRanges(hWnd);
else
{
Rectangle.left = 0;
Rectangle.top = 0;
Rectangle.right = (WORD)bi.biWidth;
Rectangle.bottom = (WORD)bi.biHeight;
/* Compute the size of the window rectangle based on the given
* client rectangle size and the window style, then size the
* window.
*/
AdjustWindowRect(&Rectangle, dwStyle, TRUE);
SetWindowPos(hWnd, (HWND)NULL, 0, 0, Rectangle.right - Rectangle.left + 1
, Rectangle.bottom - Rectangle.top + 1, SWP_NOMOVE |
SWP_NOZORDER);
}
InvalidateRect(hWnd, NULL, TRUE);
}
/****************************************************************************
* *
* FUNCTION : GetRealClientRect(HWND hwnd, LPRECT lprc) *
* *
* PURPOSE : Calculates the client rectangle taking scrollbars into *
* consideration. *
* *
****************************************************************************/
void GetRealClientRect (hwnd, lprc)
HWND hwnd;
PRECT lprc;
{
DWORD dwStyle;
dwStyle = GetWindowLong(hwnd, GWL_STYLE);
GetClientRect(hwnd, lprc);
if (dwStyle & WS_HSCROLL)
lprc->bottom += GetSystemMetrics(SM_CYHSCROLL);
if (dwStyle & WS_VSCROLL)
lprc->right += GetSystemMetrics(SM_CXVSCROLL);
}
/****************************************************************************
* *
* FUNCTION : SetScrollRanges(hwnd) *
* *
* PURPOSE : *
* *
****************************************************************************/
void SetScrollRanges (hwnd)
HWND hwnd;
{
RECT rc;
int iRangeH, iRangeV, i;
static int iSem = 0;
if (!iSem)
{
iSem++;
GetRealClientRect(hwnd, &rc);
for (i = 0; i < 2; i++)
{
iRangeV = ptSize.y - rc.bottom;
iRangeH = ptSize.x - rc.right;
if (iRangeH < 0)
iRangeH = 0;
if (iRangeV < 0)
iRangeV = 0;
if (GetScrollPos(hwnd, SB_VERT) > iRangeV || GetScrollPos(hwnd,
SB_HORZ) >
iRangeH)
InvalidateRect(hwnd, NULL, TRUE);
SetScrollRange(hwnd, SB_VERT, 0, iRangeV, TRUE);
SetScrollRange(hwnd, SB_HORZ, 0, iRangeH, TRUE);
GetClientRect(hwnd, &rc);
}
iSem--;
}
}
/*********** THE FOLLOWING FUNCTIONS ARE FOR CLIPBOARD SUPPORT **************/
/****************************************************************************
* *
* FUNCTION : CopyHandle (HANDLE h) *
* *
* PURPOSE : Makes a copy of the given global memory block. *
* *
* RETURNS : A handle to the new block. *
* *
****************************************************************************/
HANDLE CopyHandle (h)
HANDLE h;
{
BYTE huge *lpCopy;
BYTE huge *lp;
HANDLE hCopy;
DWORD dwLen;
dwLen = GlobalSize(h);
if (hCopy = GlobalAlloc(GHND, dwLen))
{
lpCopy = (BYTE huge *)GlobalLock(hCopy);
lp = (BYTE huge *)GlobalLock(h);
while (dwLen--)
*lpCopy++ = *lp++;
GlobalUnlock(hCopy);
GlobalUnlock(h);
}
return hCopy;
}
/****************************************************************************
* *
* FUNCTION : CopyPalette(HPALETTE hpal) *
* *
* PURPOSE : Makes a copy of a GDI logical palette *
* *
* RETURNS : A handle to the new palette. *
* *
****************************************************************************/
HPALETTE CopyPalette (hpal)
HPALETTE hpal;
{
PLOGPALETTE ppal;
int nNumEntries;
if (!hpal)
return NULL;
GetObject(hpal, sizeof(int), (LPSTR)&nNumEntries);
if (nNumEntries == 0)
return NULL;
ppal = (PLOGPALETTE)LocalAlloc(LPTR, sizeof(LOGPALETTE) + nNumEntries *
sizeof(PALETTEENTRY));
if (!ppal)
return NULL;
ppal->palVersion = PALVERSION;
ppal->palNumEntries = nNumEntries;
GetPaletteEntries(hpal, 0, nNumEntries, ppal->palPalEntry);
hpal = CreatePalette(ppal);
LocalFree((HANDLE)ppal);
return hpal;
}
/****************************************************************************
* *
* FUNCTION : CopyBitmap (HBITMAP hbm) *
* *
* PURPOSE : Copies the given bitmap to another. *
* *
* RETURNS : A handle to the new bitmap. *
* *
****************************************************************************/
HBITMAP CopyBitmap (hbm)
HBITMAP hbm;
{
BITMAP bm;
RECT rc;
if (!hbm)
return NULL;
GetObject(hbm, sizeof(BITMAP), (LPSTR)&bm);
rc.left = 0;
rc.top = 0;
rc.right = bm.bmWidth;
rc.bottom = bm.bmHeight;
return CropBitmap(hbm, &rc);
}
/****************************************************************************
* *
* FUNCTION : CropBitmap (hbm,lprect) *
* *
* PURPOSE : Crops a bitmap to a new size specified by the lprect *
* parameter. *
* *
* RETURNS : A handle to the new bitmap. *
* *
****************************************************************************/
HBITMAP CropBitmap (hbm, prc)
HBITMAP hbm;
PRECT prc;
{
HDC hMemDCsrc;
HDC hMemDCdst;
HDC hdc;
HBITMAP hNewBm;
BITMAP bm;
int dx, dy;
if (!hbm)
return NULL;
hdc = GetDC(NULL);
hMemDCsrc = CreateCompatibleDC(hdc);
hMemDCdst = CreateCompatibleDC(hdc);
GetObject(hbm, sizeof(BITMAP), (LPSTR)&bm);
dx = prc->right - prc->left;
dy = prc->bottom - prc->top;
hNewBm = CreateBitmap(dx, dy, bm.bmPlanes, bm.bmBitsPixel, NULL);
if (hNewBm)
{
SelectObject(hMemDCsrc, hbm);
SelectObject(hMemDCdst, hNewBm);
BitBlt(hMemDCdst, 0, 0, dx, dy, hMemDCsrc, prc->left, prc->top, SRCCOPY);
}
ReleaseDC(NULL, hdc);
DeleteDC(hMemDCsrc);
DeleteDC(hMemDCdst);
return hNewBm;
}
/****************************************************************************
* *
* FUNCTION : RenderFormat(int cf) *
* *
* PURPOSE : Renders the currently displayed DIB in CF_DIB or *
* CF_BITMAP format.The bitmap is clipped to the current *
* rcClip. *
* *
* RETURNS : A handle to the DIB *
* *
****************************************************************************/
HANDLE RenderFormat (cf)
int cf;
{
HANDLE h = NULL;
HBITMAP hbm;
if (!bLegitDraw)
return NULL;
switch (cf)
{
case CF_BITMAP:
if (hbmCurrent && !IsRectEmpty(&rcClip))
h = CropBitmap(hbmCurrent, &rcClip);
else
{
if (hbmCurrent)
h = CopyBitmap(hbmCurrent);
else if (hdibCurrent)
h = BitmapFromDib(hdibCurrent, hpalCurrent);
else if (achFileName[0] && (hdibCurrent = OpenDIB(achFileName)))
h = BitmapFromDib(hdibCurrent, hpalCurrent);
else
h = NULL;
if (h && !IsRectEmpty(&rcClip))
{
hbm = CropBitmap(h, &rcClip);
DeleteObject(h);
h = hbm;
}
}
break;
case CF_DIB:
if (!IsRectEmpty(&rcClip))
{
if (hbm = RenderFormat(CF_BITMAP))
{
h = DibFromBitmap(hbm, BI_RGB, 0, hpalCurrent);
DeleteObject(hbm);
}
}
else
{
if (!hdibCurrent && hbmCurrent)
h = DibFromBitmap(hbmCurrent, BI_RGB, 0, hpalCurrent);
else if (hdibCurrent)
h = CopyHandle(hdibCurrent);
else if (achFileName[0])
h = OpenDIB(achFileName);
else
h = NULL;
}
break;
case CF_PALETTE:
if (hpalCurrent)
h = CopyPalette(hpalCurrent);
break;
}
return h;
}
/****************************************************************************
* *
* FUNCTION : RealizeDibFormat(DWORD biStyle, WORD biBits) *
* *
* PURPOSE : Realize the current DIB in the specifed format *
* This function is used to get a specific format of CF_DIB *
* *
* biStyle DIB format RGB or RLE *
* biBits Bits per pixel 1,4,8,24 *
* *
* RETURNS : A handle to the created DIB. *
* *
****************************************************************************/
HANDLE RealizeDibFormat (biStyle, biBits)
DWORD biStyle;
WORD biBits;
{
BITMAPINFOHEADER bi;
if (!bLegitDraw)
return NULL;
DibInfo(hbiCurrent, &bi);
/* Do we have the requested format already? */
if (bi.biCompression == biStyle && bi.biBitCount == biBits)
{
if (!hdibCurrent)
hdibCurrent = RenderFormat(CF_DIB);
}
else
{
if (!hbmCurrent)
hbmCurrent = RenderFormat(CF_BITMAP);
if (hbmCurrent)
{
if (hdibCurrent)
GlobalFree(hdibCurrent);
hdibCurrent = DibFromBitmap(hbmCurrent, biStyle, biBits, hpalCurrent);
}
}
return hdibCurrent;
}
/****************************************************************************
* *
* FUNCTION : ErrMsg (PSTR sz,...) *
* *
* PURPOSE : Opens a Message box with a error message in it.The user can*
* select the OK button to continue *
* *
* RETURNS : FALSE to indicate an error has occured. *
* *
****************************************************************************/
int ErrMsg (PSTR sz, ...)
{
char ach[128];
wvsprintf(ach, sz, (LPSTR)(&sz + 1)); /* Format the string */
MessageBox(NULL, ach, NULL, MB_OK | MB_ICONEXCLAMATION | MB_APPLMODAL);
return FALSE;
}
/****************************************************************************
* *
* FUNCTION : fDialog(int id,HWND hwnd,FARPROC fpfn) *
* *
* PURPOSE : This function displays a dialog box *
* *
* RETURNS : The exit code. *
* *
****************************************************************************/
BOOL fDialog (id, hwnd, fpfn)
int id;
HWND hwnd;
FARPROC fpfn;
{
BOOL f;
HANDLE hInst;
hInst = GetWindowWord(hwnd, GWW_HINSTANCE);
fpfn = MakeProcInstance(fpfn, hInst);
f = DialogBox(hInst, MAKEINTRESOURCE(id), hwnd, fpfn);
FreeProcInstance(fpfn);
return f;
}
/****************************************************************************
* *
* FUNCTION : AppAbout( hDlg, uiMessage, wParam, lParam ) *
* *
* PURPOSE : Dialog function for the About... dialog box *
* *
****************************************************************************/
BOOL FAR PASCAL AppAbout (hDlg, uiMessage, wParam, lParam)
HWND hDlg;
unsigned uiMessage;
WORD wParam;
long lParam;
{
switch (uiMessage)
{
case WM_COMMAND:
if (wParam == IDOK)
EndDialog(hDlg, TRUE);
break;
case WM_INITDIALOG:
return TRUE;
}
return FALSE;
}